package iks.game
{
	import flash.display.*;
	import flash.events.*;
	import flash.utils.*;
	import iks.*;
	import iks.utils.*;
	import iks.utils.ui.*;
	
	/**
	 * 游戏框架类
	 */
	public final class KGame
	{
		use namespace iks_internal;
		
		/**
		 * 构造函数
		 */
		public function KGame(pvt : PrivateClass)
		{
			if (!(pvt is PrivateClass))
				throw new Error("禁止实例化该类");
		}
		
		/**
		 * 初始化游戏对象
		 * @param	stage 游戏主体所在的场景
		 * @param	initFunc 游戏初始化函数
		 * @param	logicFunc 游戏逻辑函数
		 * @param	frameRate 舞台的帧频
		 */
		public function init(stage : Stage, initFunc : Function, logicFunc : Function, flashFrameRate : int = 60) : void
		{
			if (m_stage != null)
				return;
			
			// 初始化按键
			KInput.initInput(stage);
			
			// 记录舞台和传递来的函数
			m_stage = stage;
			m_initFunction = initFunc;
			m_logicFunction = logicFunc;
			
			// 初始化渲染帧率
			m_stage.frameRate = flashFrameRate;
			m_stage.align = StageAlign.TOP;
			m_stage.scaleMode = StageScaleMode.NO_SCALE;
			
			// 获取每一帧的间隔时间常量, 单位 ms.
			KTimerManager.iks_interval = 1000.0 / flashFrameRate;
			
			// 初始化逻辑更新, 拥有最好的优先级
			m_stage.addEventListener(Event.ENTER_FRAME, enterUpdateHandler, false, 0x01, false);
			
			// 初始化游戏
			m_initFunction();
		}
		
		/// 获得游戏实例对象
		public static function getInstance() : KGame
		{
			if (m_game == null)
				m_game = new KGame(new PrivateClass());
			
			return m_game;
		}
		
		/// 启动游戏
		public function start() : void
		{
			m_isRun = true;
		}
		
		/// 停止游戏
		public function stop() : void
		{
			m_isRun = false;
		}
		
		/// 主逻辑是否在运行
		public function get isRun() : Boolean
		{
			return m_isRun;
		}
		
///////////////////////////////////////////////////////////////////////////////////////////////////
// 私有域
///////////////////////////////////////////////////////////////////////////////////////////////////
		
		/// 帧模式响应事件
		private function enterUpdateHandler(evt : Event) : void
		{
			runGame();
		}
		
		/// 运行计时器模式游戏主体函数
		private function runGame() : void
		{
			if (m_isRun)
				m_logicFunction();
				
			KInput.update();
		}
		
		private var m_initFunction : Function = null;
		private var m_logicFunction : Function = null;
		private var m_isRun : Boolean = false;
		private var m_stage : Stage = null;
		
		// 单态实体对象
		private static var m_game : KGame = null;
	}
}

class PrivateClass
{
	public function PrivateClass()
	{
	
	}
}

































// ============================================================================
//
// end file
//
// ============================================================================


